//package com.ihunanren.taobao.module.screen;
//
//import static com.google.common.base.Strings.isNullOrEmpty;
//
//import java.io.PrintWriter;
//import java.util.Set;
//import java.util.regex.Pattern;
//
//import javax.servlet.http.HttpServletResponse;
//
//import org.springframework.beans.factory.annotation.Autowired;
//
//import com.alibaba.citrus.service.requestcontext.buffered.BufferedRequestContext;
//import com.alibaba.citrus.service.uribroker.URIBrokerService;
//import com.alibaba.citrus.service.uribroker.uri.ServletContentURIBroker;
//import com.alibaba.citrus.turbine.dataresolver.Param;
//import com.ihunanren.biz.taobao.ao.IHtmlAO;
//import com.ihunanren.common.Pair;
//import com.ihunanren.common.spider.AbstractWebSipder;
//import com.ihunanren.common.spider.WebPage;
//import com.ihunanren.common.spider.WebSpiderParam;
//
///**
// * @author kalman03
// */
//public class SpiderDemo {
//	@Autowired
//	private HttpServletResponse response;
//	@Autowired
//	private BufferedRequestContext brc;
//	@Autowired
//	private IHtmlAO htmlAO;
//	@Autowired
//	private URIBrokerService uriBrokerService;
//
//	public void execute(@Param(name = "thread", defaultValue = "3") int thread,
//			@Param(name = "deep", defaultValue = "1") int deep,
//			@Param(name = "baseUrl", defaultValue = "") String baseUrl,
//			@Param(name = "regex", defaultValue = "") final String regex) {
//		try {
//			// 必须关闭buffering，未完成的页面才会被显示在浏览器上。
//			brc.setBuffering(false);
//			// 设置content type，但不需要设置charset，框架会设置正确的charset。
//			response.setContentType("text/html");
//			final PrintWriter out = response.getWriter();
//			out.println(getHeader());
//
//			Pair<String, Boolean> pair = isValidParameters(thread, deep, baseUrl, regex);
//			if(!pair.snd){
//				out.println(getNotice(pair.fst));
//				out.flush(); // 将当前的结果立即显示到浏览器上
//				return;
//			}
//			
//			SearchControl.resetStart();
//			
//			WebSpiderParam param = createWebSpiderParam(thread, deep, baseUrl, regex);
//			
//			new AbstractWebSipder<PrintWriter>(param,out) {
//				@Override
//				public void onStart(WebSpiderParam param, PrintWriter out) {
//					out.println(assemableContext("Start:"+param.toString()));
//					out.flush(); // 将当前的结果立即显示到浏览器上
//				}
//				@Override
//				public void doHandle(WebPage webPage, PrintWriter rout) {
//					String parentUrl = webPage.getCurUrl();
//					String [] regexs = null;
//					if(!isNullOrEmpty(regex)){
//						regexs = new String[]{regex};
//					}
//					Set<String> childList = webPage.getMatchedLinkList(regexs);
//					for(String childUrl : childList){
//						int num = SearchControl.getAndIncreate();
//						if(num <= 20){
//							String str = getContext(parentUrl, webPage.getDeep(),childUrl, webPage.getDeep()+1);
//							out.print(str);
//							out.println();
//							try {Thread.sleep(1000);} catch (InterruptedException e) {}
//						}else{
//							if(!SearchControl.isPrint){
//								out.println(assemableContext("发现爬取到的链接有点多，先插播个广告，然后告诉你结果吧，广告来了......"));
//								out.println(getAd());
//								SearchControl.isPrint = true;
//							}
//							long intvel = System.currentTimeMillis()-SearchControl.getLongAndIncr();
//							if(intvel > 1000*6){
//								if(SearchControl.resetCount <=1){
//									out.println(assemableContext("过了6秒了，系统还在费劲的爬取中，亲，你就等等，关了浏览器就等于白跑了"));
//								}else{
//									out.println(assemableContext("又过了"+SearchControl.resetCount+"秒，系统还在费劲的爬取中，亲，你就等等，关了浏览器就等于白跑了"));
//								}
//								SearchControl.resetStart();
//							}
//						}
//						out.flush(); // 将当前的结果立即显示到浏览器上
//					}
//				}
//				@Override
//				public void onException(Throwable e, PrintWriter out) {
//					out.println(assemableContext("Exception::"+e.getMessage()));
//					out.flush(); // 将当前的结果立即显示到浏览器上
//				}
//				@Override
//				public void onEnd(long success, long failed, PrintWriter out) {
//					out.println(assemableContext("End:success="+success+",failed="+failed));
//					out.flush(); // 将当前的结果立即显示到浏览器上
//				}
//			}.doSpider();
//
//			out.println(getAd());
//			out.println(getFooter());
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//	}
//	
//	private static class SearchControl {
//		public static int searchCount = 0;
//		public static long start ;
//		public static boolean isPrint = false;
//		public static int resetCount = 0;
//
//		public static int getAndIncreate() {
//			searchCount++;
//			return searchCount;
//		}
//
//		public static long getLongAndIncr() {
//			return start;
//		}
//		
//		public static long resetStart(){
//			start = System.currentTimeMillis();
//			return start;
//		}
//	}
//	
//	private WebSpiderParam createWebSpiderParam(int thread,int deep,String baseUrl,String regex){
//		WebSpiderParam param = new WebSpiderParam();
//		param.setBaseUrl(baseUrl);
//		param.setDeep(deep);
//		if(!isNullOrEmpty(regex)){
//			param.setLinkRegex(new String[]{regex});
//		}
//		param.setThread(thread);
//		return param;
//	}
//
//	private Pair<String, Boolean> isValidParameters(int thread,int deep,String baseUrl,String regex){
//		boolean b = true;
//		StringBuilder sb = new  StringBuilder();
//		if(thread <1 || thread > 5){
//			sb.append("thread不小于1且不大于5,");
//			b = false;
//		}
//		if(deep <1 || deep>3){
//			sb.append("deep不小于1且不大于3,");
//			b = false;
//		}
//		if(isNullOrEmpty(baseUrl) || !isHttpUrl(baseUrl)){
//			sb.append("baseUrl不正确,");
//			b = false;
//		}
//		if(!isRightRegex(regex)){
//			sb.append("regex不正确,");
//			b = false;
//		}
//		sb.append("你输入的参数是[thread=").append(thread).append(",deep=")
//				.append(deep).append(",baseUrl=").append(baseUrl)
//				.append(",regex=").append(regex).append("]");
//		return new Pair<String, Boolean>(sb.toString(), b);
//	}
//
//	private boolean isRightRegex(String regex){
//		if(isNullOrEmpty(regex))return true;
//		try {
//			Pattern.compile(regex);
//		} catch (Exception e) {
//			return false;
//		}
//		return true;
//	}
//	
//	private boolean isHttpUrl(String url) {
//		return true;
////		String regex = "[a-zA-z]+://[^\\s]*";
////		return Pattern.compile(regex).matcher(regex).matches();
//	}
//
//	private String assemableContext(String info){
//		return String.format(htmlAO.getNotice(), info);
//	}
//	
//	private String getContext(String parentUrl, int parentDeep,
//			String childUrl, int childDeep) {
//		String str = htmlAO.getContext();
//		if (!isNullOrEmpty(str)) {
//			return String.format(str, parentUrl, parentDeep, childUrl,childDeep);
//		}
//		return null;
//	}
//
//	private String getNotice(String str){
//		return String.format(htmlAO.getNotice(), str);
//	}
//	
//	private String getAd() {
//		return htmlAO.getSpiderDemoAd();
//	}
//
//	private String getFooter() {
//		return htmlAO.getSpiderDemoFooter();
//	}
//
//	private String getHeader() {
//		String header = htmlAO.getSpiderDemoHeader();
//		ServletContentURIBroker broker = (ServletContentURIBroker) uriBrokerService.getURIBroker("assetsContent");
//		String str = broker.getServerURI();
//		String cssPath = str + "/css/spider_demo.css";
//		if (!isNullOrEmpty(header)) {
//			header = String.format(header, cssPath);
//		}
//		return header;
//	}
//}
